/**
 单链表是一种链式存取的数据结构
 链表中的数据是以节点来表示的,每个节点的构成：元素 + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个节点的地址

 链表可以很方便的中断和恢复
 * */

class Update {
  constructor(payload, nextUpdate) {
    this.payload = payload;
    this.nextUpdate = nextUpdate;
  }
}

class UpdateQueue {
  constructor() {
    this.baseState = null; // 原状态
    this.firstUpdate = null; // 第一个更新
    this.lastUpdate = null; // 最后一个更新
  }

  enqueueUpdate(update) {
    if (this.firstUpdate == null) {
      this.firstUpdate = this.lastUpdate = update;
    } else {
      this.lastUpdate.nextUpdate = update; // 让上一个最后一个节点的nextUpdate指向自己
      this.lastUpdate = update;// 让最后一个节点指向自己
    }
  }

  // 获取老状态 然后遍历整个链表 进行更新 得到新状态
  forceUpdate() {
    let currentState = this.baseState || {};
    let currentUpdate = this.firstUpdate;
    while (currentUpdate) {
      const nextState = typeof currentUpdate.payload == 'function' ?
        currentUpdate.payload(currentState) : currentUpdate.payload;
      currentState = {...currentState, ...nextState};
      currentUpdate = currentUpdate.nextUpdate;
    }
    this.firstUpdate = this.lastUpdate = null;
    this.baseState = currentState;
    return currentState;
  }
}

//计算器 刚开始 {number:0}
//setState(state=>({number:state.number+1}))
const queue = new UpdateQueue();
queue.enqueueUpdate(new Update({name: 'ahhh'}))
queue.enqueueUpdate(new Update({number: 0}))
queue.enqueueUpdate(new Update((state) => ({number: state.null + 1})));
queue.enqueueUpdate(new Update((state) => ({number: state.null + 1})));
queue.forceUpdate()
